package br.ufscar.acumaaf.smc.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import br.ufscar.acumaaf.smc.model.Usuario;
import br.ufscar.acumaaf.smc.persistence.DataBaseHelper;

public class UsuarioDAO {

	private DataBaseHelper dataBaseHelper;
	private SQLiteDatabase db;
	
	public UsuarioDAO(Context context) {
		dataBaseHelper = new DataBaseHelper(context);
		db = dataBaseHelper.getWritableDatabase();
	}
	
	public boolean inserirUsuario(Usuario user){
		ContentValues usuario = new ContentValues();
		usuario.put("codigousuario", user.getCodigoUsuario());
		usuario.put("nome", user.getNome());
		usuario.put("usuario", user.getUsuario());
		usuario.put("senha", user.getSenha());
		usuario.put("tipousuario",user.getTipoUsuario());
		try{
			Long retorno = db.insert("usuario", null, usuario);
			Log.i(DataBaseHelper.FILTRO, "UsuarioDAO:insereUsuario | Inserindo " + usuario + " no Banco de Dados. Retorno = " + retorno + " (ID da linha recém-inserida ou -1 caso tenha ocorrido um erro!)");
			Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:insereUsuario | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			if(retorno == Long.valueOf("-1")){
				Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:insereUsuario | Retorno false!");
				return false;
			}
			else{
				Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:insereUsuario | Retorno true!");
				return true;
			}
		} catch (Exception e) {
			Log.e("erro", "UsuarioDAO:inserirUsuario(): | Gerou uma exceção e não inseriu o usuário no Banco de Dados", e);
			return false;
		}
	}
	
	public boolean atualizaUsuario(Usuario user){
		ContentValues usuario = new ContentValues();
		usuario.put("codigousuario", user.getCodigoUsuario());
		usuario.put("nome", user.getNome());
		usuario.put("usuario", user.getUsuario());
		usuario.put("senha", user.getSenha());
		usuario.put("tipousuario",user.getTipoUsuario());
		int retorno = db.update("usuario", usuario, "codigousuario = " + user.getCodigoUsuario(), null);
		if(retorno > 0){
			Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:atualizaUsuario | Atualizando o Usuário de código " + user.getCodigoUsuario() + " do Banco de Dados. Retorno = " + retorno + "(Número de linhas afetadas pela atualização!)");
			Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:atualizaUsuario | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			return true;
		}
		else{
			Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:atualizaUsuario | Falha ao tentar atualizar um usuário. Retorno = " + retorno + "(Número de linhas afetadas pela atualização!)");
			Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:atualizaUsuario | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			return false;
		}			
	}
	
	public void deletaUsuario(Long codigo){
		int retorno = db.delete("usuario", "codigousuario = " + codigo, null);
		if(retorno > 0){
			Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:deletaUsuario | Deletando o Usuário de código " + codigo + " do Banco de Dados. Retorno = " + retorno + "(Número de linhas afetadas pela Deleção!)");
		}
		else{
			Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:deletaUsuario | Falha ao tentar deletar um usuário. Retorno = " + retorno + "(Número de linhas afetadas pela Deleção!)");
		}
		Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:deletaUsuario | Fechando o Bando de Dados!");
		//fechando o Banco de Dados
		dataBaseHelper.close();
		db.close();
	}
	
	public Usuario buscarUsuarioPeloCodigo(Integer codigo){
		Cursor cursor = null;
		Usuario usuario = new Usuario();
		try {
			 cursor = db.query(true, "usuario", new String[]{"codigousuario","nome","usuario","senha","tipousuario"} , "codigousuario = " + codigo, null, null, null, null, null);
			 if(cursor.getCount() > 0){
				int codigoUsuarioIndex = cursor.getColumnIndex("codigousuario");
				int nomeIndex = cursor.getColumnIndex("nome");
				int usuarioIndex = cursor.getColumnIndex("usuario");
				int senhaIndex = cursor.getColumnIndex("senha");
				int tipoUsuarioIndex = cursor.getColumnIndex("tipousuario");
				cursor.moveToFirst();
				usuario.setCodigoUsuario(cursor.getInt(codigoUsuarioIndex));
				usuario.setNome(cursor.getString(nomeIndex));
				usuario.setUsuario(cursor.getString(usuarioIndex));
				usuario.setSenha(cursor.getString(senhaIndex));
				usuario.setTipoUsuario(cursor.getInt(tipoUsuarioIndex));
				cursor.moveToNext();
			}
			 Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:buscarUsuarioPeloCodigo | Retornando o usuário " + usuario);
			 if(cursor != null){
					cursor.close();
					dataBaseHelper.close();
					db.close();
				}
			 return usuario;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				db.close();
			}
		}
	}

	public Integer buscarUsuarioPeloUsuarioSenha(String user, String password){
		Cursor cursor = null;
		Usuario usuario = new Usuario();
		try {
			 cursor = db.query(true, "usuario", new String[]{"codigousuario","nome","usuario","senha","tipousuario"} , "usuario = ? AND senha = ?", new String[]{user,password}, null, null, null, null);
			 if(cursor.getCount() > 0){
				int codigoUsuarioIndex = cursor.getColumnIndex("codigousuario");
				int nomeIndex = cursor.getColumnIndex("nome");
				int usuarioIndex = cursor.getColumnIndex("usuario");
				int senhaIndex = cursor.getColumnIndex("senha");
				int tipoUsuarioIndex = cursor.getColumnIndex("tipousuario");
				cursor.moveToFirst();
				usuario.setCodigoUsuario(cursor.getInt(codigoUsuarioIndex));
				usuario.setNome(cursor.getString(nomeIndex));
				usuario.setUsuario(cursor.getString(usuarioIndex));
				usuario.setSenha(cursor.getString(senhaIndex));
				usuario.setTipoUsuario(cursor.getInt(tipoUsuarioIndex));
				cursor.moveToNext();
			}
			 else{
				 Log.i(DataBaseHelper.FILTRO, "UsuarioDAO:buscarUsuarioPeloUsuarioSenha | Não Achou o usuário. Retornando 0.");
				 return 0;
			 }
			 Log.i(DataBaseHelper.FILTRO,"UsuarioDAO:buscarUsuarioPeloUsuarioSenha | Achou! Retornando o usuário " + usuario);
			 if(cursor != null){
					cursor.close();
					dataBaseHelper.close();
					db.close();
				}
			 return usuario.getCodigoUsuario();
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}
	
	public List<Usuario> buscarTodosUsuarios(){
		Cursor cursor = null;
		try {
			List<Usuario> listaUsuarios = new ArrayList<Usuario>();
			cursor = db.query("usuario", new String[]{"codigousuario", "nome", "usuario", "senha", "tipousuario"}, null, null, null, null, "nome");
			if(cursor.getCount() > 0){
				int codigoUsuarioIndex = cursor.getColumnIndex("codigousuario");
				int nomeIndex = cursor.getColumnIndex("nome");
				int usuarioIndex = cursor.getColumnIndex("usuario");
				int senhaIndex = cursor.getColumnIndex("senha");
				int tipoUsuarioIndex = cursor.getColumnIndex("tipousuario");
				cursor.moveToFirst();
				do{
					Usuario usuario = new Usuario();
					usuario.setCodigoUsuario(cursor.getInt(codigoUsuarioIndex));
					usuario.setNome(cursor.getString(nomeIndex));
					usuario.setUsuario(cursor.getString(usuarioIndex));
					usuario.setSenha(cursor.getString(senhaIndex));
					usuario.setTipoUsuario(cursor.getInt(tipoUsuarioIndex));
					listaUsuarios.add(usuario);
					cursor.moveToNext();					
				}while(!cursor.isAfterLast());
			}
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
			return listaUsuarios;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}
}